Tableau Desktop 10 新機能:クロスデータベースジョイン機能を試してみる #tableau
Tableau 10 新機能紹介シリーズ、当エントリは『クロスデータベースジョイン』機能に関する、正式リリース前の先取り内容紹介となります。複数のデータソースをTableau上で結合(join)させ、1つのデータソースとして扱える様にするという機能です。
目次
データの準備
今回のこの機能を試すために、それぞれのデータソースとして用意する『元ネタ』をまずは入手します。以下サイトから、映画のレイティング(評価)に関するデータがそこそこのボリュームあるので、これを使いたいと思います。
ダウンロード後、解凍。一番多いデータでratings.csvの2288万件、次いでtags.csvが58万件となっています。これらをそれぞれ、異なるデータソースの環境に突っ込みたいと思います。
$ cd Desktop/ml-latest/ $ ll total 1257384 -rw-r--r--@ 1 xxxxxxxxx staff 8305 1 29 11:41 README.txt -rw-r--r--@ 1 xxxxxxxxx staff 725747 5 26 10:37 links.csv -rw-r--r--@ 1 xxxxxxxxx staff 1729811 1 29 11:37 movies.csv -rw-r--r--@ 1 xxxxxxxxx staff 620204630 1 29 11:32 ratings.csv -rw-r--r--@ 1 xxxxxxxxx staff 21094823 1 29 11:22 tags.csv $ wc links.csv 34208 34208 725747 links.csv $ wc movies.csv 34209 155908 1729811 movies.csv $ wc ratings.csv 22884378 22884378 620204630 ratings.csv $ wc tags.csv 586995 964414 21094823 tags.csv $
環境準備:Amazon Redshift
まずはAmazon Redshift。一番件数の多いratingsデータをこの環境に投入します。
# DROP TABLE IF EXISTS public.tabv10_mlratings; CREATE TABLE public.tabv10_mlratings ( user_id INT NOT NULL, movie_id INT NOT NULL, rating FLOAT, timestamp_bigint BIGINT ); CREATE TABLE # \timing Timing is on. # COPY public.tabv10_mlratings FROM 's3://xxxxxxxxxxxxxxxxxxxx/movielens/ratings.csv' CREDENTIALS 'aws_access_key_id=XXXXXXXXXX;aws_secret_access_key=YYYYYYYYYY' IGNOREHEADER 1 CSV; INFO: Load into table 'tabv10_mlratings' completed, 22884377 record(s) loaded successfully. COPY Time: 41639.793 ms # SELECT COUNT(*) FROM public.tabv10_mlratings; count ---------- 22884377 (1 row) Time: 221.462 ms
環境準備:RDS(MySQL)
次いでMySQL。同じAWS環境下にRDSのMySQLを立ち上げ、
データベースに接続。今回CSVをローカルからインポートしたかったのでログインの際に--local-infileオプションを付与しています。
$ mysql --local-infile=1 -h cm-mysqldb.xxxxxxxxxxxx.us-east-1.rds.amazonaws.com -P 3306 -u xxxxxxx -p
テーブルを作成し、
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | cmmysqldb | | innodb | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.17 sec) mysql> USE cmmysqldb; Database changed # CREATE TABLE tabv10_mltags ( user_id INT NOT NULL, movie_id INT NOT NULL, tags VARCHAR(300), timestamp_bigint BIGINT ); Query OK, 0 rows affected (0.36 sec) mysql>
データ投入。(実際は1行で実行しています)
mysql> LOAD DATA LOCAL INFILE '/Users/xxxxx/xxxxxx/ml-latest/tags.csv' INTO TABLE cmmysqldb.tabv10_mltags FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'; Query OK, 586995 rows affected, 584 warnings (6.21 sec) Records: 586995 Deleted: 0 Skipped: 0 Warnings: 584
環境準備:Microsoft Access
業務としてありそうなケースを想定してみる、という事で3つ目のデータソースはAccessを選んでみました。こちらは手元の環境でAccessを使えなかったのでWindows環境下でaccessファイルを作成してみる事にしました。
Accessを起動し、[外部データ]→[テキストファイル]を選択。
取り込み対象のCSVファイルを指定し、取り込み実施。
このような感じで無事取込んでファイルを作成する事が出来ました。
環境準備:CSV
4つめの環境はファイルをそのまま、CSVとして取込む形で行きたいと思います。という事で割愛。
いざ、ジョイン!
さぁ、これで異なる4つのデータソースが揃いました。以下手順で1つずつデータソースを結合させて行きたいと思います。
- ratings.csv [Amazon Redshift]
- tags.csv [RDS(MySQL)]
- links.csv [Microsoft Access]
- movies.csv [CSV File]
1つ目のデータソース: Amazon Redshiftの作成
まずはAmazon Redshift。従来通りの手順で準備出来ました。バージョン10からは以下の様な表記でデータソース名も出るようになってるんですね。
2つ目のデータソース: RDS(MysQL)の作成&データソースの結合
2つ目のデータソース、RDS(MySQL)についても作成は従来通り。[追加]ボタンが新設されていますのでそこから新たなデータソースを追加を行います。
データソース作成後、キー同士を結合させる形でデータベーステーブル同士をジョイン。ご覧の様に、異なるデータベースのテーブルがTableau上で繋がるようになりました!
3つ目のデータソース: Microsoft Accessの作成&データソースの結合
本来なら2つ目で『繋がったね、良かったね』で終えても良いと思うのですが、おまけでもう2つ行っちゃいましょう。Accessについてはファイルを指定して読み込み、データソースとして接続します。
3つ目のデータソースも無事結合させる事が出来ました。
4つ目のデータソース: CSVファイルの作成&データソースの結合
そして最後4つ目のデータソース。CSVファイル。こちらもテキストファイルとして読み込み、キーで結合させてあげます。合計4つのデータソースがTableau上で1つのデータソースとして結合出来ました!
まとめ
以上、Tableau 10の新機能、『クロスデータベースジョイン』を実際に試してみたエントリでした。
ただ今回のケース、元となるデータが2000万件ある形で残り3つのデータソースと結合させるというのは相当に時間が掛かり、おパフォーマンスも必要としていました。(初回結合時で20分近く掛かり、端末もファンが暫く唸りを上げていた) この機能、とても便利な機能ではありますが、大量件数での処理となるとやはり相当パワー・パフォーマンスを必要とする様です。今回の様なケースの場合、まず少なめの件数(数万件、行っても数十万件レベルでしょうか)で試してみてどの様な結果が得られるかを検証し、ある程度目処が付いたところで一箇所に集約する(今回の場合であればAmazon Redshiftへ)、というステップを踏んで分析環境を整えていく方が望ましいでしょう。一旦接続まで行った後に『抽出ファイル』をまず作成しておいてそれを使う、というのもひとつの手です。いずれにしても、この機能はこれまで出来なかった事が出来るようになった!という事で大変嬉しい機能だと思います。是非お試し頂ければ幸いです。